home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
putz
/
putzwind.i
< prev
Wrap
Text File
|
1997-10-26
|
42KB
|
1,270 lines
IMPLEMENTATION MODULE PutzWindows;
FROM SYSTEM IMPORT ADDRESS, ADR, CADR, CALLSYS, TSIZE;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
(* MM2 *)
FROM GrafBase IMPORT Rect, Rectangle, LongRect, Point;
FROM Lists IMPORT List, ResetList, NextEntry, NoOfEntries;
IMPORT Keyboard, MOSGlobals, BinOps, Strings, StrConv;
FROM Keyboard IMPORT SpecialCode;
FROM Directory IMPORT GetDefaultPath, SetDefaultPath, Delete, Rename;
FROM FileNames IMPORT ValidatePath, SplitPath, FileName;
(* Magic *)
FROM MagicSys IMPORT sINTEGER;
IMPORT mtAppl, mtUtils, mtDials, mtTextfiles, mtDir, mtAlerts;
IMPORT MagicAES, MagicVDI, MagicStrings, MagicDOS, MagicFSM;
FROM MagicVDI IMPORT MFDB, VDICall, VDIIntIn, VDIPtsIn, VDIControl;
(* CAT *)
IMPORT FontSelect;
IMPORT WdwManager, RectFuncs, CatGlobal;
IMPORT ConfVars, Clip, MTPaths;
IMPORT dataSys;
FROM Void IMPORT v;
(* CatPutz *)
IMPORT PutzDo;
IMPORT PutzRsc;
IMPORT PutzList;
IMPORT PutzGroup;
IMPORT PutzTypes;
IMPORT PutzGr;
FROM PutzTypes IMPORT TextJustification, ptrDispEntry,
listEntryType, putzList,
ptrGrEntry, groupDeleted,
defaultOpts;
IMPORT PutzHelp;
IMPORT Catputz2;
(*$R-,S-*)
CONST noClipAlt = '[3][CATPUTZ:|Konnte nicht auf|das Clipboard schreiben!][[Abbruch]';
doDelAlt = '[3][CATPUTZ:|Lschen in den selektierten|Gruppen starten?][[Ja|:[Nein]';
CONST (* Variablennamen *)
cWdwRect = 'StatWindowRect';
cWdwFont = 'StatFont';
cWdwFontSize= 'StatFontSize';
cWdwTop = 'StatWindowStart';
cWdwLineDist= 'StatWindowLineDist';
cWdwLeftOffs= 'StatWindowLeftOffset';
cWdwOpen = 'StatWindowOpen';
TYPE WdwPtr = POINTER TO wlRec;
wlRec = RECORD
list : List; (* list with attr.s *)
wdw : sINTEGER;
vdi : sINTEGER;
font : INTEGER;
fontSize : sINTEGER;
fontScalable: BOOLEAN;
charHeight,
charWidth : INTEGER;
windLines : INTEGER;
maxWidth : INTEGER;
startLine : INTEGER;
leftOffset : INTEGER;
currSize : Rectangle;
butWork : Rectangle;
isHidden : BOOLEAN;
lastOb : INTEGER;
isLocked : BOOLEAN; (* Liste wird gerade verndert *)
END;
(* globale Variablen *)
VAR
inOpen : BOOLEAN;
pixOff : INTEGER;
lineDist: INTEGER;
lineHeight: INTEGER;
inDelete: BOOLEAN;
windows : WdwPtr;
butBox : mtUtils.tObjcTree;
PROCEDURE outputText(displayList: List; f: mtTextfiles.TEXTFILE; isCsv : BOOLEAN);
VAR entry : ptrDispEntry;
str : PutzTypes.MaxStr;
i : CARDINAL;
j : INTEGER;
part : INTEGER;
BEGIN
(* Ausgabe *)
CatGlobal.busyMouse;
ResetList (displayList);
entry := NextEntry (displayList);
i := 0;
WHILE entry # NIL DO
INC (i);
IF i MOD 7 = 0 THEN CatGlobal.busyMouse(); END;
IF entry^.type = separatorLine
THEN
IF ~isCsv
THEN
FOR j := 0 TO PutzList.GetMaxLineWidth() DO
IF j+1 < TSIZE (PutzTypes.MaxStr)
THEN
str[j] := '=';
str[j+1] := '=';
END;
END;
mtTextfiles.WriteLine (f, str);
mtTextfiles.WriteLn (f);
END;
ELSE
FOR part := 0 TO PutzList.GetPartCount() DO
PutzList.GetPart (entry, part, str, ~isCsv);
mtTextfiles.WriteLine (f, str);
IF isCsv
THEN
(* Separator schreiben *)
mtTextfiles.WriteLine (f, ",");
END;
END;
mtTextfiles.WriteLn (f);
END;
entry := NextEntry (displayList);
END;
(* File wieder schlieen *)
mtTextfiles.CloseTextfile (f);
END outputText;
PROCEDURE OutputStat (ptr: WdwPtr);
VAR f : INTEGER;
tf : mtTextfiles.TEXTFILE;
fName : PutzTypes.FileStr;
fnShort : PutzTypes.FileStr;
msg : PutzTypes.MaxStr;
targetPath: PutzTypes.FileStr;
BEGIN
WITH ptr^ DO
(* Filenamen erfragen *)
MagicStrings.Assign (MTPaths.DataPath, targetPath);
MagicStrings.Assign ('', fName);
IF PutzGr.SelectFile ("Ausgabedatei:", "*.TXT", targetPath, fName, TRUE)
THEN
(* Datei anlegen *)
MagicStrings.Assign (FileName (fName), fnShort);
f := MagicDOS.Fopen (fName, {});
IF f > 0
THEN
v.int := MagicDOS.Fclose (f);
(* File existiert, nachfragen *)
mtAppl.MouseArrow();
MagicStrings.Assign ('[2][CATPUTZ|Die Datei existiert schon!|Datei:|', msg);
MagicStrings.Append (fnShort, msg);
MagicStrings.Append ('][[Ersetzen|An[hngen|[Abbruch]', msg);
v.int := mtAlerts.Alert (2,msg);
IF v.int = 3 THEN RETURN END;
IF v.int = 2
THEN
IF ~mtTextfiles.OpenTextfile (fName, mtTextfiles.APPEND, 32000, tf)
THEN
RETURN
END;
ELSE
IF ~mtTextfiles.OpenTextfile (fName, mtTextfiles.WRITE, 32000, tf)
THEN
RETURN
END;
END;
ELSE
IF ~mtTextfiles.OpenTextfile (fName, mtTextfiles.WRITE, 32000, tf)
THEN
RETURN
END;
END;
outputText (list, tf, FALSE);
mtAppl.MouseArrow();
END;
END;
END OutputStat;
PROCEDURE ToClip (ptr: WdwPtr);
VAR scrapPath : PutzTypes.MaxStr;
tf : mtTextfiles.TEXTFILE;
fName : PutzTypes.FileStr;
fnShort : PutzTypes.FileStr;
state : INTEGER;
msg : PutzTypes.MaxStr;
entry : ptrDispEntry;
BEGIN
IF Clip.GetScrap (scrapPath)
THEN
Clip.ScrapClear(scrapPath, '');
(* Datei anlegen *)
fnShort := "SCRAP.TXT";
Strings.Concat (scrapPath, fnShort, fName, v.bool);
IF ~mtTextfiles.OpenTextfile (fName, mtTextfiles.WRITE, 32000, tf)
THEN
v.int := mtAlerts.Alert (1, noClipAlt);
RETURN
END;
outputText (ptr^.list, tf, FALSE);
fnShort := "SCRAP.CSV";
Strings.Concat (scrapPath, fnShort, fName, v.bool);
IF ~mtTextfiles.OpenTextfile (fName, mtTextfiles.WRITE, 32000, tf)
THEN
v.int := mtAlerts.Alert (1, noClipAlt);
RETURN
END;
outputText (ptr^.list, tf, TRUE);
mtAppl.MouseArrow();
END;
END ToClip;
PROCEDURE FindWindow (wdw: INTEGER): WdwPtr;
BEGIN
IF windows # NIL
THEN
IF windows^.wdw = wdw
THEN
RETURN windows;
END;
END;
RETURN NIL;
END FindWindow;
PROCEDURE FindLine (ptr: WdwPtr; line: INTEGER): ptrDispEntry;
VAR l : List;
i : INTEGER;
entry: ptrDispEntry;
BEGIN
IF ptr # NIL
THEN
l := ptr^.list;
ResetList (l);
entry := NextEntry (l);
i := 0;
WHILE (entry # NIL) & (i < line) DO
INC (i);
entry := NextEntry (l);
END;
RETURN entry;
END;
RETURN NIL;
END FindLine;
PROCEDURE LineIsSelectable(ptr: WdwPtr; line: INTEGER): BOOLEAN;
VAR entry : ptrDispEntry;
BEGIN
entry := FindLine (ptr, line);
RETURN (entry # NIL) & (entry^.type = dataEntry) & (entry^.data^.info # NIL);
END LineIsSelectable;
PROCEDURE LineIsSelected (ptr: WdwPtr; line: INTEGER): BOOLEAN;
VAR entry : ptrDispEntry;
BEGIN
entry := FindLine (ptr, line);
RETURN (entry # NIL) & (entry^.data # NIL) & (entry^.data^.selected);
END LineIsSelected;
PROCEDURE SelectLine (ptr: WdwPtr; line: INTEGER);
VAR entry : ptrDispEntry;
BEGIN
entry := FindLine (ptr, line);
IF (entry # NIL) & (entry^.data # NIL)
THEN
entry^.data^.selected := NOT entry^.data^.selected;
END;
END SelectLine;
PROCEDURE AdjustTreePos (r: Rectangle; VAR rt : Rectangle);
BEGIN
WITH butBox^[0] DO
obX := r.x;
obY := r.y;
obWidth := r.w;
rt.x := obX; rt.y := obY;
rt.w := obWidth; rt.h := obHeight+1;
END;
END AdjustTreePos;
PROCEDURE snapWdw (wdw, vdi : INTEGER; special : ADDRESS; VAR work : Rectangle);
CONST minWindWidth = 128;
minWindHeight = 48;
VAR wl : WdwPtr;
sLine: INTEGER;
wdwSize: Rectangle;
BEGIN
wl := WdwPtr (special);
WITH wl^ DO
AdjustTreePos (work, butWork);
IF ~inOpen
THEN
WITH work DO
DEC (h, butWork.h);
INC (h); (* Um Rundungsfehler zu vermeiden *)
h := ((h+lineDist) DIV (charHeight+lineDist)) * (charHeight+lineDist);
WHILE w < minWindWidth DO INC(w, charWidth) END;
WHILE h < minWindHeight DO INC(h, charHeight+lineDist) END;
windLines := (BinOps.LowerInt(y+h-1, INTEGER(mtAppl.MaxHeight-1)) - y+1) DIV (charHeight+lineDist);
currSize := work;
INC (work.h, butWork.h);
WdwManager.SetScrollParms (wdw, w-charWidth, windLines-1, charWidth, 1);
END;
WindowParms (wdw, wdwSize, sLine);
v.bool := ConfVars.SetConfigInt (cWdwTop, sLine);
v.bool := ConfVars.SetConfigRect (cWdwRect, wdwSize);
END;
(*
IF startLine + (currSize.h) DIV charHeight > INTEGER(NoOfEntries (list))
THEN
WdwManager.SetWdwDocument (wdw, LongRect {leftOffset,
LONG(INTEGER(NoOfEntries(list)) - (currSize.h DIV charHeight)),
maxWidth*charWidth, VAL(LONGINT, NoOfEntries (list)-1)});
END;
*)
END;
END snapWdw;
PROCEDURE getScroll (wdw, vdiH : INTEGER; special : ADDRESS; VAR work : Rectangle);
VAR ptr : WdwPtr;
full : Rectangle;
BEGIN
ptr := WdwPtr (special);
AdjustTreePos (work, ptr^.butWork);
DEC (work.h, butBox^[0].obHeight+1);
INC (work.y, butBox^[0].obHeight+1);
WITH work DO
ptr^.windLines := (BinOps.LowerInt(y+h-1, INTEGER(mtAppl.MaxHeight-1)) - y+1) DIV (ptr^.charHeight+lineDist);
WdwManager.SetScrollParms (wdw, w-ptr^.charWidth, ptr^.windLines-1, ptr^.charWidth, 1);
ptr^.currSize := work;
END;
END getScroll;
PROCEDURE topWdw (wdw, vdi : INTEGER; special : ADDRESS) : BOOLEAN;
BEGIN
RETURN TRUE
END topWdw;
PROCEDURE closeWdw (wdw, vdi : INTEGER; special : ADDRESS; force : BOOLEAN) : BOOLEAN;
VAR wl : WdwPtr;
wdwSize: Rectangle;
sLine : INTEGER;
BEGIN
wl := WdwPtr (special);
WindowParms (wdw, wdwSize, sLine);
v.bool := ConfVars.SetConfigInt (cWdwTop, sLine);
v.bool := ConfVars.SetConfigRect (cWdwRect, wdwSize);
v.bool := ConfVars.SetConfigBool (cWdwOpen, FALSE);
FontSelect.UnloadFonts (vdi);
RETURN TRUE;
END closeWdw;
PROCEDURE hasSelectedEntries (ptr : WdwPtr; VAR first : INTEGER): BOOLEAN;
VAR i : INTEGER;
entry : ptrDispEntry;
BEGIN
WITH ptr^ DO
ResetList (list);
entry := NextEntry (list);
i := 0;
WHILE entry # NIL DO
IF (entry^.data # NIL) & (entry^.data^.selected) THEN RETURN TRUE END;
INC (i);
entry := NextEntry (list);
END;
END;
RETURN FALSE;
END hasSelectedEntries;
PROCEDURE countSelectedEntries (ptr : WdwPtr) : CARDINAL;
VAR i : INTEGER;
(*$Reg *) counter : CARDINAL;
entry : ptrDispEntry;
BEGIN
WITH ptr^ DO
ResetList (list);
entry := NextEntry (list);
counter := 0;
WHILE entry # NIL DO
IF (entry^.data # NIL) & (entry^.data^.selected) THEN INC (counter) END;
entry := NextEntry (list);
END;
END;
RETURN counter;
END countSelectedEntries;
PROCEDURE redrawEntry (ptr: WdwPtr; line: INTEGER);
VAR rect : Rectangle;
BEGIN
WITH ptr^ DO
IF (wdw < 0) OR isHidden THEN RETURN END;
(*
IF (line < startLine) OR (line > startLine + windLines + 1) THEN RETURN END;
*)
rect := currSize;
INC (rect.x, pixOff);
rect.y := rect.y + (line - startLine) * (charHeight+lineDist);
rect.h := charHeight + lineDist;
WdwManager.RedrawWdw (wdw, rect);
END;
END redrawEntry;
PROCEDURE toggleEntry (ptr : WdwPtr; entry: INTEGER);
VAR rect : Rectangle;
BEGIN
WITH ptr^ DO
IF LineIsSelectable (ptr, entry)
THEN
SelectLine (ptr, entry);
redrawEntry (ptr, entry);
END;
END;
END toggleEntry;
PROCEDURE redrawButton (wdw: INTEGER; butBox: mtUtils.tObjcTree; ob: INTEGER);
VAR r : Rectangle;
BEGIN
mtUtils.ObjcPos (butBox, ob, r.x, r.y);
DEC (r.x); DEC (r.y);
r.w := butBox^[ob].obWidth+1;
r.h := butBox^[ob].obHeight+1;
WdwManager.RedrawWdw (wdw, r);
END redrawButton;
CONST oneGroupSelTxt = "Eine Gruppe selektiert";
noGroupSelTxt = "Keine Gruppe selektiert";
manyGroupSelTxt = " Gruppen selektiert";
PROCEDURE careForButtons(ptr : WdwPtr; redraw : BOOLEAN);
(* Enablet/disablet die Buttonleiste *)
VAR selectCount : INTEGER;
rdwCount,
i : INTEGER;
selSet,
disSet : BITSET;
str : PutzTypes.MaxStr;
BEGIN
WITH ptr^ DO
selSet := {};
disSet := {};
FOR i := Delmsgs TO Saveconf DO
IF mtUtils.InState (butBox, i, MagicAES.SELECTED) THEN INCL (selSet, i); END;
IF mtUtils.InState (butBox, i, MagicAES.DISABLED) THEN INCL (disSet, i); END;
END;
(* selectCount := countSelectedEntries(ptr); *)
selectCount := PutzDo.CountSelectedEntries(putzList);
IF selectCount = 0
THEN
mtUtils.SetObjcString (butBox, Ctrltext, noGroupSelTxt);
ELSIF selectCount = 1
THEN
mtUtils.SetObjcString (butBox, Ctrltext, oneGroupSelTxt);
ELSE
MagicStrings.Assign (StrConv.IntToStr (selectCount, 0), str);
MagicStrings.Append (manyGroupSelTxt, str);
mtUtils.SetObjcString (butBox, Ctrltext, str);
END;
mtUtils.SetState (butBox, Delmsgs, MagicAES.DISABLED,
(selectCount = 0));
mtUtils.SetState (butBox, Delgroup, MagicAES.DISABLED,
(selectCount # 1));
mtUtils.SetState (butBox, Confdel, MagicAES.DISABLED,
(selectCount = 0));
(* Alle neuzeichnen *)
IF redraw & (wdw >= 0) THEN
rdwCount := 0;
FOR i := Delmsgs TO Saveconf DO
IF (mtUtils.InState (butBox, i, MagicAES.SELECTED) # (i IN selSet)) OR
(mtUtils.InState (butBox, i, MagicAES.DISABLED) # (i IN disSet))
THEN
INC (rdwCount);
END;
END;
IF rdwCount < 5
THEN
FOR i := Delmsgs TO Saveconf DO
IF (mtUtils.InState (butBox, i, MagicAES.SELECTED) # (i IN selSet)) OR
(mtUtils.InState (butBox, i, MagicAES.DISABLED) # (i IN disSet))
THEN
redrawButton (wdw, butBox, i);
END;
END;
redrawButton (wdw, butBox, Ctrltext);
ELSE
redrawButton (wdw, butBox, 0);
END;
END;
END;
END careForButtons;
PROCEDURE handleButtons (ptr : WdwPtr; ob : INTEGER) : BOOLEAN;
VAR i : INTEGER;
selectCount : INTEGER;
x, y : INTEGER;
select : INTEGER;
grEntry: ptrGrEntry;
putzOpts: PutzTypes.putzOptsRec;
iStartLine,
iFont,
iFontSize: INTEGER;
wdwSize : Rectangle;
sLine : INTEGER;
BEGIN
WITH ptr^ DO
IF ~mtUtils.InState (butBox, ob, MagicAES.DISABLED)
& mtUtils.InFlag (butBox, ob, MagicAES.SELECTABLE)
THEN
(* Button selektieren *)
mtUtils.InclState (butBox, ob, MagicAES.SELECTED);
redrawButton (wdw, butBox, ob);
mtUtils.Bounce();
inDelete := TRUE;
(* Selektierte Nachrichten zhlen *)
selectCount := PutzDo.CountSelectedEntries(putzList);
CASE ob OF
Saveas: OutputStat (ptr); |
Copyclip: ToClip (ptr); |
Selall: PutzDo.SelectAll (TRUE);
WdwManager.RedrawWdw (wdw, currSize); |
Selnone: PutzDo.SelectAll (FALSE);
WdwManager.RedrawWdw (wdw, currSize); |
Delmsgs: IF 1 = mtAlerts.Alert (1, doDelAlt)
THEN
inDelete := TRUE;
MagicAES.WindUpdate (MagicAES.ENDUPDATE);
PutzDo.InitDelete (wdw);
MagicAES.WindUpdate (MagicAES.BEGUPDATE);
inDelete := FALSE;
WdwManager.FullRedrawWdw (wdw);
END; |
Delgroup: grEntry := PutzDo.FirstSelectedGroup(putzList);
IF (grEntry # NIL) & (grEntry^.info^.catNumber # dataSys.private)
THEN
inDelete := TRUE;
IF PutzGroup.deleteGroup (grEntry, FALSE)
THEN
groupDeleted := TRUE;
PutzGr.ClearDisplayList();
PutzGr.BuildDisplayList(PutzTypes.displayList);
PutzDo.CalcTotals();
SetNewList (wdw, PutzTypes.displayList);
END;
inDelete := FALSE;
END; |
Config : IF selectCount = 0
THEN
v.bool := PutzRsc.doOptBox (FALSE, defaultOpts);
ELSE
IF selectCount = 1
THEN
grEntry := PutzDo.FirstSelectedGroup (putzList);
putzOpts := PutzDo.InitGroupFlags (grEntry^.info^.catNumber, TRUE, v.bool);
ELSE
putzOpts := defaultOpts;
END;
(* Dialog ausfhren *)
IF PutzRsc.doOptBox (TRUE, putzOpts)
THEN
grEntry := PutzDo.FirstSelectedGroup (putzList);
WHILE grEntry # NIL DO
(* Und jetzt noch die Konfigvariablen setzen *)
PutzDo.SetGroupFlags (grEntry^.info^.catNumber, putzOpts);
grEntry := PutzDo.NextSelectedGroup (putzList, grEntry^.info^.catNumber);
END;
END;
END; |
Confdel: IF selectCount > 0
THEN
grEntry := PutzDo.FirstSelectedGroup (putzList);
WHILE grEntry # NIL DO
(* Konfigvariablen lschen *)
PutzDo.DeleteGroupFlags (grEntry^.info^.catNumber);
grEntry := PutzDo.NextSelectedGroup (putzList, grEntry^.info^.catNumber);
END;
END; |
Confopt: Strings.Assign (PutzTypes.tmpPath, defaultOpts.tmpDir, v.bool);
IF PutzRsc.doPathBox(defaultOpts.useTmp, defaultOpts.tmpDir)
THEN
IF defaultOpts.useTmp
THEN
Strings.Assign (defaultOpts.tmpDir, PutzTypes.tmpPath, v.bool);
ELSE
Strings.Assign (MTPaths.DataPath, PutzTypes.tmpPath, v.bool);
END;
END; |
Fontsel: GetWindowFont (wdw, iFont, iFontSize);
IF FontSelect.DoSelectFont (vdi, FALSE, iFont, iFontSize)
THEN
SetWindowFont (wdw, iFont, iFontSize);
END; |
Loadinf: isLocked := TRUE;
v.bool := PutzGr.ReadNewInf();
(* Fenster neu initialisieren
* Font und Gre
*)
(* Variablen neu lesen *)
ConfVars.GetConfDefInt (cWdwFont, iFont, 1);
ConfVars.GetConfDefInt (cWdwFontSize, iFontSize, 10);
ConfVars.GetConfDefInt (cWdwTop, iStartLine, 0);
ConfVars.GetConfDefRect (cWdwRect, wdwSize, WdwManager.deskSize);
ConfVars.GetConfDefInt (cWdwLineDist, lineDist, 2);
ConfVars.GetConfDefInt (cWdwLeftOffs, pixOff, 8);
(* Jetzt bernehmen *)
WdwManager.SetWdwSize (wdw, wdwSize);
(* Font setzen *)
SetWindowFont (wdw, iFont, iFontSize);
(* Und jetzt die Liste wechseln *)
startLine := iStartLine;
isLocked := FALSE;
SetNewList (wdw, PutzTypes.displayList);
|
Saveconf: (* Ein paar Parameter sichern *)
WindowParms (wdw, wdwSize, sLine);
v.bool := ConfVars.SetConfigInt (cWdwTop, sLine);
v.bool := ConfVars.SetConfigRect (cWdwRect, wdwSize);
v.bool := ConfVars.SetConfigBool (cWdwOpen, TRUE);
PutzRsc.SaveParameter (MTPaths.DataPath); |
ELSE
END;
careForButtons (ptr, TRUE);
(* Button deselektieren *)
mtUtils.ExclState (butBox, ob, MagicAES.SELECTED);
redrawButton (ptr^.wdw, butBox, ob);
inDelete := FALSE;
RETURN TRUE
ELSE
RETURN FALSE;
END;
END;
END handleButtons;
PROCEDURE clickInWindow(win, vdiH : INTEGER; special : ADDRESS;
x,y : INTEGER; kstate, buts : BITSET; clicks : INTEGER): BOOLEAN;
VAR ptr: WdwPtr;
transY : INTEGER;
ob : INTEGER;
entrySelected : BOOLEAN;
line : INTEGER;
but : BITSET;
i : INTEGER;
selectCount : INTEGER;
PROCEDURE selectArea;
VAR firstLine,
lastLine : INTEGER;
i : INTEGER;
r,
rect : Rectangle;
first : BOOLEAN;
BEGIN
WITH ptr^ DO
rect := Rectangle{x, y, 0, 0};
mtAppl.MouseFinger ();
MagicAES.GrafRubberbox (x, y, -32767, -32767, rect.w, rect.h);
mtAppl.MouseArrow();
WITH rect DO
IF w < 0
THEN
INC(x, w);
w := -w
END;
IF h < 0
THEN
INC (y, h);
h := -h
END;
END;
(* clippen *)
rect := RectFuncs.ClipRect (rect, currSize);
rect.h := BinOps.LowerInt (rect.h, currSize.y + currSize.h - 1 - rect.y);
(* Jetzt testen, ob selektierbarer Bereich geschnitten wurde *)
IF (((rect.x - currSize.x) < pixOff) & ((rect.x + rect.w - currSize.x) < pixOff)) OR
(((rect.x - currSize.x) > maxWidth*charWidth) & ((rect.x + rect.w - currSize.x) > maxWidth*charWidth))
THEN
RETURN
END;
firstLine := (rect.y - currSize.y) DIV (charHeight + lineDist);
lastLine := (rect.y + rect.h - currSize.y) DIV (charHeight + lineDist);
IF (rect.x - currSize.x > pixOff) OR (rect.x + rect.w - currSize.x > pixOff)
THEN
r := currSize;
INC (r.x, pixOff);
r.h := charHeight + lineDist;
first := TRUE;
FOR i := startLine+firstLine TO startLine+lastLine DO
IF (i>= 0) & LineIsSelectable (ptr, i)
THEN
SelectLine (ptr, i);
IF (i >= startLine) & (i <= startLine + windLines)
THEN
(* redraw *)
IF first THEN
r.y := currSize.y + INTEGER(i - startLine) * (charHeight+lineDist);
first := FALSE
ELSE
r.h := currSize.y + INTEGER(i - startLine + 1) * (charHeight+lineDist) - r.y;
END;
END;
END;
END;
IF ~first THEN WdwManager.RedrawWdw (wdw, r) END;
END;
END;
END selectArea;
BEGIN
ptr := WdwPtr (special);
WITH ptr^ DO
IF inDelete THEN RETURN FALSE END;
IF isLocked THEN RETURN FALSE END;
IF ~(0 IN buts) THEN RETURN FALSE END;
IF RectFuncs.IsInRect (x, y, butWork)
THEN
ob := MagicAES.ObjcFind (butBox, 0, 8, x, y);
IF (ob >= Delmsgs) & (ob <= Saveconf)
THEN
RETURN handleButtons (ptr, ob);
END;
ELSIF RectFuncs.IsInRect (x, y, currSize)
THEN
IF ~((MagicAES.KRSHIFT IN kstate) OR (MagicAES.KLSHIFT IN kstate))
THEN
(* deselectEntries (ptr); *)
END;
(* Zeile herausfinden *)
line := (y - currSize.y) DIV (charHeight + lineDist);
transY := (y - currSize.y - (lineDist DIV 2));
entrySelected := (transY >= line*(charHeight + lineDist)) &
(transY < ((line+1) * charHeight + line*lineDist)) &
((x - currSize.x) >= pixOff) &
((x - currSize.x) <= maxWidth*charWidth);
IF entrySelected
THEN
toggleEntry (ptr, line+startLine);
REPEAT
MagicAES.GrafMkstate (x, y, but, kstate);
UNTIL ~(0 IN but);
ELSE
MagicAES.GrafMkstate (x, y, but, kstate);
IF 0 IN but
THEN
(* Graf-Rubberbox aufrufen *)
selectArea();
END;
END;
careForButtons (ptr, TRUE);
RETURN TRUE;
END;
END;
RETURN FALSE;
END clickInWindow;
PROCEDURE GetString (ob: INTEGER; VAR str: ARRAY OF CHAR);
BEGIN
CASE ob OF
Delmsgs: MagicStrings.Assign ("Nachrichten in Gruppen lschen (^D)", str); |
Delgroup: MagicStrings.Assign ("Gruppe lschen (^G)", str); |
Selall: MagicStrings.Assign ("Alle selektieren (^A)", str); |
Selnone: MagicStrings.Assign ("Selektion aufheben (^H)", str); |
Loadinf: MagicStrings.Assign ("CAT.INF laden ... (^L)", str); |
Saveas: MagicStrings.Assign ("Fenster speichern als ... (^S)", str); |
Copyclip: MagicStrings.Assign ("Fenster kopieren (^C)", str); |
Fontsel: MagicStrings.Assign ("Zeichensatz auswhlen (Z)", str); |
Config: MagicStrings.Assign ("Flags einstellen ... (F)", str); |
Confdel: MagicStrings.Assign ("Flags lschen (K)", str); |
Confopt: MagicStrings.Assign ("Einstellungen ... (E)", str); |
Saveconf: MagicStrings.Assign ("Einstellungen sichern (S)", str); |
ELSE
MagicStrings.Assign ("", str);
END;
END GetString;
PROCEDURE handleRect (wdw, vdiH: INTEGER; special: ADDRESS; which: INTEGER;
moX, moY : INTEGER): BOOLEAN;
VAR ptr: WdwPtr;
ob : INTEGER;
str: PutzTypes.MaxStr;
BEGIN
ptr := WdwPtr (special);
WITH ptr^ DO
IF RectFuncs.IsInRect (moX, moY, butWork)
THEN
ob := MagicAES.ObjcFind (butBox, 0, 8, moX, moY);
ELSE
ob := -1;
END;
IF lastOb # ob
THEN
lastOb := ob;
GetString (ob, str);
mtUtils.SetObjcString (butBox, Flyhelp, str);
redrawButton (wdw, butBox, Flyhelp);
RETURN TRUE;
END;
END;
RETURN FALSE;
END handleRect;
PROCEDURE handlePutzKey (wdw, vdiH : INTEGER; special : ADDRESS; taste: INTEGER; char, scan : CHAR; kstate : BITSET) : BOOLEAN;
VAR ptr : WdwPtr;
gemCh : CARDINAL;
key : MOSGlobals.Key;
ctrl : BOOLEAN;
shift : BOOLEAN;
done : BOOLEAN;
BEGIN
ptr := WdwPtr (special);
WITH ptr^ DO
gemCh := ORD(scan) * 256 + ORD(char);
Keyboard.GemCharToKey (gemCh, SHORT (INTEGER(kstate)), key);
ctrl := CatGlobal.WithCtrl (kstate);
shift := CatGlobal.WithShift (kstate);
done := TRUE;
IF Keyboard.IsSpecial (key)
THEN
CASE Keyboard.SpecialKey (key) OF
home : startLine := 0;
WdwManager.SetWdwDocument (wdw, LongRect{LONG(leftOffset), 0, LONG(maxWidth*charWidth),
VAL(LONGINT, NoOfEntries (list))}); |
clr : startLine := INTEGER(NoOfEntries (list)) - windLines + 1;
WdwManager.SetWdwDocument (wdw, LongRect{LONG(leftOffset), VAL(LONGINT, NoOfEntries (list)) - LONG(windLines) + 1, LONG(maxWidth*charWidth),
VAL(LONGINT, NoOfEntries (list))}); |
left : WdwManager.ScrollLeft (wdw, 1); |
soln : WdwManager.PageLeft (wdw); |
right : WdwManager.ScrollRight (wdw, 1); |
eoln : WdwManager.PageRight (wdw); |
up : WdwManager.ScrollUp (wdw, 1); |
down : WdwManager.ScrollDown (wdw, 1); |
pgUp : WdwManager.PageUp (wdw); |
pgDown : WdwManager.PageDown (wdw); |
help : PutzHelp.DoHelp (PutzHelp.window); |
(* CatPutz-Keys *)
ctrlD : RETURN handleButtons (ptr, Delmsgs); |
ctrlG : RETURN handleButtons (ptr, Delgroup); |
ctrlA : RETURN handleButtons (ptr, Selall); |
ctrlH : RETURN handleButtons (ptr, Selnone); |
ctrlL : RETURN handleButtons (ptr, Loadinf); |
ctrlS : RETURN handleButtons (ptr, Saveas); |
ctrlC : RETURN handleButtons (ptr, Copyclip); |
altZ : RETURN handleButtons (ptr, Fontsel); |
altF : RETURN handleButtons (ptr, Config); |
altK : RETURN handleButtons (ptr, Confdel); |
altE : RETURN handleButtons (ptr, Confopt); |
altS : RETURN handleButtons (ptr, Saveconf); |
ELSE
done := FALSE
END;
ELSE
done := FALSE;
END;
RETURN done;
END;
RETURN FALSE
END handlePutzKey;
PROCEDURE GetTextWidth (ptr: WdwPtr; REF str: ARRAY OF CHAR; VAR width: INTEGER);
VAR extent : ARRAY [0..3] OF Point;
BEGIN
WITH ptr^ DO
IF str[0] = 0C THEN
width := 0;
RETURN
END;
IF fontScalable
THEN
MagicFSM.InqFExtent (vdi, str, extent);
ELSE
MagicVDI.InqTextextent (vdi, str, extent);
END;
width := extent[1].x - extent[0].x;
END;
END GetTextWidth;
PROCEDURE drawWdw (wdw, vdi : INTEGER; special : ADDRESS; frame : Rectangle); (* x, y, w, h : sINTEGER); *)
VAR entry : ptrDispEntry;
str : ARRAY [0..255] OF CHAR;
part,
xCoor,
width,
xOffset,
yOutput,
i : INTEGER;
just: TextJustification;
clip: Rectangle;
wl : WdwPtr;
fill : Rectangle;
tWidth,
tempX : INTEGER;
BEGIN
wl := WdwPtr (special);
WITH wl^ DO
clip := frame;
IF RectFuncs.rcIntersect (butWork, clip)
THEN
careForButtons (wl, FALSE);
mtDials.DialDraw (butBox, 0, 8, clip, TRUE);
mtAppl.MouseOff();
END;
clip := frame;
IF RectFuncs.rcIntersect (currSize, clip)
THEN
clip := RectFuncs.ClipRect (frame, currSize);
clip.w := clip.x + clip.w - 1;
clip.h := clip.y + clip.h -1;
MagicVDI.FillRectangle(vdi, clip);
IF ~isLocked
THEN
IF clip.x = currSize.x THEN
INC (clip.x, pixOff);
END;
clip.x := BinOps.LowerInt (clip.x, clip.w);
WdwManager.SetClip (vdi, clip, FALSE);
ResetList (list);
entry := NextEntry (list);
i := 0;
WHILE (entry # NIL) & (i<startLine) DO
entry := NextEntry (list);
INC(i);
END;
i := 0;
xCoor := currSize.x + pixOff - leftOffset;
yOutput := currSize.y + i * (charHeight + lineDist) + (lineDist DIV 2);
v.int := MagicVDI.SetFillcolor (vdi, MagicAES.BLACK);
WHILE (entry # NIL) & (yOutput <= clip.h) DO
xOffset := 0;
IF entry^.type = separatorLine
THEN
(* Linie zeichnen *)
fill.x := xCoor;
fill.y := yOutput + (charHeight DIV 2) - (lineHeight DIV 2);
fill.w := xCoor + maxWidth*charWidth - 1;
fill.h := fill.y + lineHeight - 1;
(* Schreibmodus setzen *)
v.int := MagicVDI.SetWritemode (vdi, MagicVDI.REPLACE);
MagicVDI.FillRectangle(vdi, fill);
v.int := MagicVDI.SetWritemode (vdi, MagicVDI.TRANSPARENT);
ELSE
FOR part := 0 TO PutzList.GetPartCount() DO
width := PutzList.GetPartWidth (part);
PutzList.GetPart (entry, part, str, FALSE);
just := PutzList.GetPartJustification (entry, part);
(* Justification noch behandeln *)
IF just = justLeft
THEN
(* MagicVDI.SetTextalignment (vdi, 0, 3, i, i); *)
MagicVDI.Text (vdi, xCoor+xOffset, yOutput+charHeight-1, str);
ELSIF just = justCenter
THEN
GetTextWidth (wl, str, tWidth);
tempX := xCoor + xOffset + (((width * charWidth) - tWidth) DIV 2);
(* MagicVDI.SetTextalignment (vdi, 1, 3, i, i); *)
MagicVDI.Text (vdi, tempX, yOutput+charHeight-1, str);
ELSE
GetTextWidth (wl, str, tWidth);
tempX := xCoor + xOffset + (width * charWidth) - tWidth - 1;
(* MagicVDI.SetTextalignment (vdi, 2, 3, i, i); *)
MagicVDI.Text (vdi, tempX, yOutput+charHeight-1, str);
END;
INC (xOffset, (width+2) * charWidth);
END;
IF (entry^.data # NIL) & (entry^.data^.selected)
THEN
fill.x := xCoor;
fill.y := yOutput;
fill.w := xCoor + maxWidth*charWidth - 1;
fill.h := yOutput + charHeight ;
(* Schreibmodus setzen *)
v.int := MagicVDI.SetWritemode (vdi, MagicVDI.XOR);
MagicVDI.FillRectangle(vdi, fill);
v.int := MagicVDI.SetWritemode (vdi, MagicVDI.TRANSPARENT);
END;
END;
entry := NextEntry(list);
INC (yOutput, charHeight+lineDist);
INC(i);
END;
v.int := MagicVDI.SetFillcolor (vdi, MagicAES.WHITE);
END;
END;
END;
END drawWdw;
PROCEDURE updateWdw (wdw, vdi : INTEGER; special : ADDRESS; begin: BOOLEAN);
BEGIN
IF begin
THEN
MagicAES.WindUpdate (MagicAES.BEGUPDATE);
mtAppl.MouseOff;
ELSE
mtAppl.MouseOn;
MagicAES.WindUpdate (MagicAES.ENDUPDATE);
END
END updateWdw;
PROCEDURE setWork (wdw, vdi : INTEGER; special : ADDRESS; doc : LongRect; slided : BOOLEAN);
VAR wl : WdwPtr;
BEGIN
wl := WdwPtr (special);
wl^.startLine := SHORT(doc.y);
wl^.leftOffset := SHORT(doc.x);
END setWork;
PROCEDURE hideWdw (wdw, vdiH : INTEGER; special : ADDRESS; hide : BOOLEAN);
VAR ptr : WdwPtr;
BEGIN
ptr := WdwPtr (special);
ptr^.isHidden := hide;
END hideWdw;
PROCEDURE OpenWindow (l : List;
VAR wdwHandle: INTEGER);
VAR i : INTEGER;
wl : WdwPtr;
title: ARRAY [0..255] OF CHAR;
BEGIN
butBox := PutzRsc.GetTreeAddr (Groupwdw);
wdwHandle := -1;
NEW (wl);
IF wl = NIL
THEN
RETURN;
END;
WITH wl^ DO
(* Defaults lesen *)
ConfVars.GetConfDefInt (cWdwFont, font, 1);
ConfVars.GetConfDefInt (cWdwFontSize, fontSize, 10);
ConfVars.GetConfDefInt (cWdwTop, startLine, 0);
ConfVars.GetConfDefRect (cWdwRect, currSize, WdwManager.deskSize);
ConfVars.GetConfDefInt (cWdwLineDist, lineDist, 2);
ConfVars.GetConfDefInt (cWdwLeftOffs, pixOff, 8);
wdw := -1;
list := l;
inOpen := TRUE;
title := " CatPutz ";
IF ~WdwManager.OpenWindow (clickInWindow, handlePutzKey,
WdwManager.handleTimerProc(NIL), WdwManager.deskSize, currSize,
{0..3}+{5..11}, TRUE, "", title, snapWdw, closeWdw,
drawWdw, topWdw, WdwManager.untopProc (NIL), updateWdw, setWork,
getScroll, hideWdw, pixOff, wl, FALSE, TRUE, TRUE, TRUE, wdw, vdi)
THEN
DISPOSE (wl);
inOpen := FALSE;
RETURN
END;
v.bool := WdwManager.SetWindowRectProc (wdw, handleRect);
v.bool := ConfVars.SetConfigBool (cWdwOpen, TRUE);
wdwHandle := wdw;
isHidden := FALSE;
isLocked := FALSE;
FontSelect.LoadFonts (vdi, i);
FontSelect.SetFont (vdi, font, fontSize, TRUE,
v.bool, fontScalable, charWidth, charHeight);
(*
FontSelect.FontSelect (vdi, font);
fontSize := FontSelect.FontSize (vdi, fontSize, i,i,charWidth,charHeight);
*)
mtUtils.SetObjcString (butBox, Flyhelp, "");
lastOb := -1;
leftOffset := 0;
PutzList.SetMaxNameLength (PutzGr.MaxNameLength());
maxWidth := PutzList.GetMaxLineWidth() + (2 * PutzList.GetPartCount()) + 2;
i := MagicVDI.SetFillstyle (vdi, MagicVDI.Full);
i := MagicVDI.SetFillcolor (vdi, MagicAES.WHITE);
(* Schreibmodus setzen *)
i := MagicVDI.SetWritemode (vdi, MagicVDI.REPLACE);
(* Textalignment setzen *)
MagicVDI.SetTextalignment (vdi, 0, 3, i, i);
WdwManager.SnapWdw (wdw);
WdwManager.SetNewDocument (wdw, LongRect{LONG(leftOffset), LONG(startLine), LONG(maxWidth*charWidth),
VAL(LONGINT, NoOfEntries (list))}, FALSE);
WdwManager.SetDocumentParms (wdw, 1, charHeight+lineDist);
WdwManager.SetScrollParms (wdw, currSize.w-charWidth, windLines-1, charWidth, 1);
inOpen := FALSE;
END;
windows := wl;
END OpenWindow;
PROCEDURE WindowParms (wdw: INTEGER; VAR size : Rectangle; VAR start : INTEGER);
(* Gibt Gre des Windows wl in size zurck *)
VAR wl: WdwPtr;
BEGIN
wl := FindWindow (wdw);
IF (wl # NIL)
THEN
WdwManager.GetWdwSize (wl^.wdw, size);
IF (size.x < 0) OR (size.y < 0) OR (size.w <= 0) OR (size.h <= 0)
THEN
size := WdwManager.deskSize;
END;
start := wl^.startLine;
END;
END WindowParms;
PROCEDURE GetWindowFont (wdw: INTEGER; VAR Font, FontSize : INTEGER);
VAR wl: WdwPtr;
BEGIN
wl := FindWindow (wdw);
IF wl # NIL
THEN
WITH wl^ DO
Font := font;
FontSize := fontSize;
END;
END;
END GetWindowFont;
PROCEDURE SetWindowFont (wdw: INTEGER; Font, FontSize : INTEGER);
VAR wl: WdwPtr;
BEGIN
wl := FindWindow (wdw);
IF wl # NIL
THEN
WITH wl^ DO
font := Font;
fontSize := FontSize;
FontSelect.SetFont (vdi, font, fontSize, TRUE,
v.bool, fontScalable, charWidth, charHeight);
v.bool := ConfVars.SetConfigInt (cWdwFont, font);
v.bool := ConfVars.SetConfigInt (cWdwFontSize, fontSize);
(*
FontSelect.FontSelect (vdi, font);
fontSize := FontSelect.FontSize (vdi, fontSize, v.int, v.int, charWidth, charHeight);
*)
(* Textalignment setzen *)
MagicVDI.SetTextalignment (vdi, 0, 3, v.int, v.int);
(* Redraw auslsen *)
WdwManager.SetDocumentParms (wdw, 1, charHeight+lineDist);
WdwManager.SnapWdw (wdw);
WdwManager.SetNewDocument (wdw, LongRect{LONG(leftOffset), LONG(startLine), LONG(maxWidth*charWidth),
VAL(LONGINT, NoOfEntries (list))}, FALSE);
WdwManager.FullRedrawWdw (wdw);
END;
END;
END SetWindowFont;
PROCEDURE FindEntryByAddr (wdw: sINTEGER; info: ADDRESS;
VAR line: INTEGER): BOOLEAN;
VAR wl: WdwPtr;
l : List;
found : BOOLEAN;
entry: ptrDispEntry;
BEGIN
found := FALSE;
wl := FindWindow (wdw);
IF wl # NIL
THEN
l := wl^.list;
ResetList (l);
entry := NextEntry (l);
line := 0;
found := FALSE;
WHILE (entry # NIL) & ~found DO
found := (entry^.type = dataEntry) & (entry^.data = info);
IF ~found
THEN
INC (line);
entry := NextEntry (l);
END;
END;
END;
RETURN found;
END FindEntryByAddr;
PROCEDURE DeselectEntry (wdw: sINTEGER; entry: ADDRESS);
VAR wl: WdwPtr;
line : INTEGER;
BEGIN
wl := FindWindow (wdw);
IF wl # NIL
THEN
IF FindEntryByAddr (wdw, entry, line)
THEN
IF LineIsSelectable (wl, line)
& LineIsSelected (wl, line)
THEN
SelectLine (wl, line);
END;
END;
END;
END DeselectEntry;
PROCEDURE RedrawEntry (wdw: INTEGER; entry: ADDRESS);
VAR wl: WdwPtr;
line : INTEGER;
BEGIN
wl := FindWindow (wdw);
IF wl # NIL
THEN
IF FindEntryByAddr (wdw, entry, line)
THEN
redrawEntry (wl, line);
END;
END;
END RedrawEntry;
PROCEDURE SetNewList (wdw: INTEGER; l : List);
VAR wl: WdwPtr;
BEGIN
wl := FindWindow (wdw);
IF wl # NIL
THEN
wl^.list := l;
PutzList.SetMaxNameLength (PutzGr.MaxNameLength());
wl^.maxWidth := PutzList.GetMaxLineWidth() + (2 * PutzList.GetPartCount()) + 2;
WdwManager.SetNewDocument (wl^.wdw, LongRect{wl^.leftOffset, LONG(wl^.startLine), wl^.maxWidth*wl^.charWidth, VAL(LONGINT, NoOfEntries (wl^.list))}, FALSE);
WdwManager.FullRedrawWdw (wl^.wdw);
END;
END SetNewList;
PROCEDURE IsPutzWindow (wdw: INTEGER): BOOLEAN;
BEGIN
RETURN FindWindow (wdw) # NIL;
END IsPutzWindow;
BEGIN
inDelete := FALSE;
inOpen := FALSE;
pixOff := 8;
lineDist := 3;
lineHeight := 2;
END PutzWindows.